1-3 小结微服务改造monorepo需要注意的几点
改造目的
- 方便调试:所有微服务在同一仓库中,统一启动和管理
- 共享 proto 文件:将 gateway、user 等服务中使用的 proto 文件抽取为
proto-pkg共享项目
三个核心工具
| 工具 | 作用 |
|---|---|
| grpc-tools | 生成 CommonJS 规范的 gRPC 客户端/服务端代码 |
| ts-proto | 生成 NestJS 侧的 TypeScript 类型代码(接口、DTO 等) |
| tsup | 编译打包 TypeScript/JavaScript 代码,输出统一的 dist/ 目录和入口文件 |
项目组织方式
proto-pkg/
├── src/ # 所有源码(utils、generated、nest 等)
├── proto/ # .proto 定义文件
├── dist/ # tsup 编译输出
└── package.json # 入口指向 dist/index.js
text
通过统一的 src/index.js 导出所有公共方法和类型,经 tsup 编译后输出到 dist/ 目录供各微服务引用。
改造后的变化
删除的内容
- 各微服务中独立的 proto 目录和生成脚本
引用方式变化
| 改造前 | 改造后 |
|---|---|
| 直接读取本地 proto 文件路径 | 使用 package definition 方式加载 |
| 各服务独立管理 proto 生成 | 通过 proto-pkg 共享包统一管理 |
| Consul 注册地址写死 | 从远端 Consul Server 动态获取 address 和 port |
后续优化方向
1. 公共方法提取
promiseifySomeMethods 等常用方法应放入共享包中,避免每个微服务重复编写。
2. 健康检查优化
NestJS 提供了 @nestjs/terminus 健康检查模块,内置多种 Health Indicator:
| Indicator | 用途 |
|---|---|
| MicroserviceIndicator | 检查微服务是否正常 |
| GRPCHealthIndicator | gRPC 服务健康检查 |
| HTTPHealthIndicator | HTTP 服务健康检查(基于 axios) |
| DNSHealthIndicator | DNS 解析检查 |
| TypeOrmHealthIndicator | 数据库连接检查 |
使用 Terminus 替代自定义的 HealthController,可以获得更标准化的健康检查能力。
参考资源
- NestJS Health Checks - Terminus 健康检查文档
- pnpm Workspaces - Monorepo 管理
↑